package cn.ges.type;

import cn.ges.string.StringUtil;

import java.math.BigDecimal;
import java.util.Optional;

/**
 * @author gespent@163.com
 * @date 2019/1/25
 */
public class TypeHelper {

    /**
     * 将一个obj类型的String 转为long类型
     *
     * @return 非纯整数或者空串 将返回null
     */
    public static Long objStr2Long(Object num) {
        String s = TypeHelper.object2Class(num, "");
        if (StringUtil.isBlank(s) || !StringUtil.isNum(s)) {
            return null;
        } else {
            return Long.decode(s);
        }
    }

    /**
     * 将一个obj类型的String 转为Int类型
     *
     * @return 非纯整数或者空串 将返回null
     */
    public static Integer objStr2Int(Object num) {
        String s = TypeHelper.object2Class(num, "");
        if (StringUtil.isBlank(s) || !StringUtil.isNum(s)) {
            return null;
        } else {
            return Integer.decode(s);
        }
    }

    /**
     * 将数字转换为BIgDecimal
     */
    public static BigDecimal number2BIgDecimal(Object num) {
        if (num == null) {
            return BigDecimal.ZERO;
        }
        if (num instanceof String) {
            return new BigDecimal((String) num);
        }
        if (num instanceof BigDecimal) {
            return (BigDecimal) num;
        } else if (num instanceof Integer) {
            return BigDecimal.valueOf((Integer) num);
        } else if (num instanceof Long) {
            return BigDecimal.valueOf((Long) num);
        } else if (num instanceof Double) {
            return BigDecimal.valueOf((Double) num);
        } else {
            return BigDecimal.ZERO;
        }
    }

    public static Long number2Long(Object o) {
        if (o == null) {
            return null;
        }
        if (o instanceof Integer) {
            return ((Integer) o).longValue();
        } else if (o instanceof Long) {
            return (long) o;
        } else if (o instanceof BigDecimal) {
            return ((BigDecimal) o).longValue();
        } else {
            return null;
        }
    }

    public static Integer number2Int(Object o) {
        if (o == null) {
            return null;
        }
        if (o instanceof Integer) {
            return (int) o;
        } else if (o instanceof Long) {
            return ((Long) o).intValue();
        } else if (o instanceof BigDecimal) {
            return ((BigDecimal) o).intValue();
        } else {
            return null;
        }

    }

    /**
     * 将一个可能为空的Object对象<br></>
     * 向下转型 为 defaultValue 的类型,当类型无法转换或者输入值为空时,返回默认值
     *
     * @param defaultValue 默认值,不应传入Null值,当传入Null值时 强制返回Null
     * @return 当参数为null时返回输入的默认值 或者返回type的实际值
     */
    @SuppressWarnings("unchecked")
    public static <T> T object2Class(Object object, T defaultValue) {

        if (defaultValue == null) {
            return null;
        }
        if (object == null) {
            return defaultValue;
        }
        final Class<?> aClass = object.getClass();
        final Class<?> aClass1 = defaultValue.getClass();

        // 如果输入值 和 defaultValue className 相同 它们可以转换
        if (aClass.getName().equals(aClass1.getName())) {
            return (T) object;
        }

        // 父类不能在不知道子类的情况下转为子类,无论哪种子类 均可以转为父类
        // 如果 defaultValue 是 输入值 的父类那么可以转换
        if (aClass1.isAssignableFrom(aClass)) {
            return (T) object;
        }
        return defaultValue;

    }

    public static String int2String(Integer source) {
        return Optional.ofNullable(source).map(temp -> Integer.toString(temp)).orElse(null);
    }

    public static String long2String(Long source) {
        return Optional.ofNullable(source).map(temp -> Long.toString(temp)).orElse(null);
    }

}
